home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
ctrlx.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-03
|
29KB
|
1,375 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
extern UWORD view_flag;
/* 終了 */
void
ctrl_x_ctrl_c()
{
if (etc_check_changed()) { /* 変更を受けている */
while(1) {
UBYTE c;
under_print0((STR)"本当に終了しますか [Y/N]? ");
fep_key_clear();
c = toupper(fep_inkey_raw());
if (c == 'Y') {
break;
} else if (c == 'N') {
return;
}
}
}
init_exit();
etc_exit(0);
}
/* ファイル読み込み(バッファチェンジ) */
void
ctrl_x_ctrl_f()
{
UBYTE filename[MAXLINE];
UBYTE w[MAXLINE];
line_seigyou();
#if 1
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN); /* システムマーク */
#endif
sprintf((char *) w,"ファイル読み込み [%s]: ",etc_ret_current_path());
if (under_input_cr_raw(w,filename) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
return;
}
ctrl_x_ctrl_f1(filename);
}
void
ctrl_x_ctrl_f1(STR filename)
{
int f,t;
if ((f = file_search(filename)) >= 0) {
under_print((STR)"[既に存在します]");
if (!CMDMOD) { /* ME モードである */
t = etc_text_search(f);
if (t<0) error("見付かりません1");
window_set_text(CWN,t);
window_set_current(CWN);
/* window_change(CWN);*/
window_change00(CWN);
disp_btm_line(CWN);
meta_ctrl_l();
}
return;
}
ctrl_x_ctrl_f0(filename);
}
void
ctrl_x_ctrl_f1_alway(STR filename)
{
int f,t;
if ((f = file_search(filename)) >= 0) {
t = etc_text_search(f);
if (t<0) {
error("見付かりません2");
}
window_set_text(CWN,t);
window_set_current(CWN);
window_change00(CWN);
disp_btm_line(CWN);
meta_ctrl_l();
return;
}
ctrl_x_ctrl_f0(filename);
}
void
ctrl_x_ctrl_f0(STR filename)
{
int flag;
int t,f;
if ((t = window_get_free_text_number()) < 0) { /* 開いたテキストがない */
etc_inp_y((STR)"扱うテキストの数が多すぎます。中断します [Y]?");
return;
}
if ((f = file_get_free_number()) < 0) { /* 開いたファイルがない */
etc_inp_y((STR)"扱うファイルの数が多すぎます。中断します [Y]?");
return;
}
flag = file_open(f,filename);
/* 指定されたファイルをオープンし、指定されたファイル番号とする */
if (flag < 0) {
error("ファイルをオープンできません");
}
/* とりあえず New file ということで、カーソルは先頭 */
file_set_text(f,t);
window_set_text(CWN,t); /* 今のウインドウに新しいテキストを割り当てる */
window_set_current(CWN);
init_current_screen();
buff_read_file(); /* カレントファイルをカレントバッファに読み込む */
file_close(f);
disp_btm_line(CWN);
under_blanc();
}
/* ファイル読み込み(挿入) */
/* 行単位である */
/* CL の前に挿入する */
/* 挿入後 CL は変わらず */
void
ctrl_x_ctrl_i()
{
int t,f;
int flag;
UBYTE filename[MAXLINE];
UBYTE w[MAXLINE];
int lc = 0;
FILE *fp;
line_seigyou();
sprintf((char *) w,"ファイル挿入 [%s]: ",etc_ret_current_path());
if (under_input_cr_raw(w,filename) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
return;
}
fp = fopen((char *)filename,"rb");
if (!fp) {
under_print((STR)"[ファイルが存在しません]");
return;
}
change_check();
init_skip_cnf(fp,w);
under_print((STR)"[ファイル挿入中]");
lc = buff_read_file_ins(fp,w,CL); /* ファイルをカレントバッファに挿入する */
disp_cl_y(CY);
fclose(fp);
sprintf((char *)w,"[挿入 %d 行]",lc);
under_print(w);
}
/* 指定範囲を小文字へ */
void
ctrl_x_ctrl_l()
{
UNIT *lp;
int lbp;
if (ctrl_x_get_mark(&lp,&lbp)) {
ctrl_x_ctrl_lu_sub(lp,lbp,CL,ANALYZE[CPX].BPOS,etc_tolower);
under_blanc();
}
}
/* 指定範囲を大文字へ */
void
ctrl_x_ctrl_u()
{
UNIT *lp;
int lbp;
if (ctrl_x_get_mark(&lp,&lbp)) {
ctrl_x_ctrl_lu_sub(lp,lbp,CL,ANALYZE[CPX].BPOS,etc_toupper);
under_blanc();
}
}
void
ctrl_x_ctrl_lu_sub(UNIT *lp,int lbp,UNIT *rp,int rbp,UINT (*func)())
{
UNIT *wp;
register int wb,nb;
int x0=0;
UBYTE w[VERY_LONG_LINE*4];
register STR pp;
register UINT c,c0;
register int flag;
etc_line_order(&lp,&lbp,&rp,&rbp);
line_get_body(w,wp = lp);
wb = lbp;
flag = 0;
while((wp != rp) || (wb < rbp)) {
pp =line_skip_xcode(&w[wb]);
if (c0 = (*pp)) { /* 行末ではない */
if (iskanji(c0)) {
c0 = (c0 << 8) | (UBYTE)pp[1];
c = (*func)(c0);
if (c != c0) {
*pp = (c >> 8) & 0xff;
pp[1] = c & 0xff;
flag = 1;
}
} else {
c = (*func)(c0);
if (c != c0) {
*pp = c;
flag = 1;
}
}
}
nb = line_touch_next_char_x(w,wb,&x0);
if (nb == wb) {
line_store_and_echo(wp,w); /* 納める */
line_get_body(w,wp = wp->ATO); /* 次の行へ */
flag = wb = 0; /* 行頭から */
} else {
wb = nb; /* 次の文字へ */
}
}
if (flag) {
line_store_and_echo(wp,w); /* 納める */
change_check();
}
line_cl_cl();
work_line_analyze();
}
/* 見つからなかったら 0 を返す */
int
ctrl_x_get_mark(UNIT **p,int *bp)
{
UBYTE w[MAXLINE];
register int a;
int b;
register UNIT *wp;
if ((a = etc_get_arg()) >= MAX_MARK) {
under_print((STR)"マーク番号が不適当です");
return(0);
}
line_seigyou();
if (wp = mark_get_mark(a,&b)) {
*p = wp;
*bp = b;
return(1);
} else {
UBYTE w[MAXLINE];
sprintf((char *) w,"マーク %1d は設定されていません",a);
under_print(w);
return(0);
}
}
/* 上へ1行貼り付きスクロール */
void
ctrl_x_ctrl_n()
{
register UNIT *newline;
line_seigyou();
if (CY) { /* カーソルは一番上ではない */
newline = disp_scroll_up1();
CY--;
} else { /* カーソルは一番上であった */
/* 1行スクロールして、カーソルはセンターへ */
UNIT *wp;
if ((wp = CL->ATO) != TAIL) { /* 後がある */
newline = disp_scroll_up1();
CL = line_trace(wp,(CWY1-CWY0)/2,&CY);
line_cl_cl();
work_line_analyze();
CX0 = CPX = 0;
work_cursor_cpx();
} else {
/* 何もしない */
return;
}
}
/* 一番下の行を書く */
if (newline) {
newline = newline->ATO;
}
disp_1line(CWY1,newline);
}
/* 下へ1行貼り付きスクロール */
void
ctrl_x_ctrl_p()
{
UNIT *wp;
line_seigyou();
if ((wp = (line_my_top())->MAE) != HEAD) { /* 一番上の前がある */
if (CY != CWY1) { /* カーソルは一番下ではない */
disp_scroll_dn1();
CY++;
} else { /* カーソルは一番下であった */
/* 1行スクロールして、カーソルはセンターへ */
disp_scroll_dn1();
disp_1line(CWY0,wp);
CL = line_trace(wp,(CWY1-CWY0)/2,&CY);
line_cl_cl();
work_line_analyze();
CX0 = CPX = 0;
work_cursor_cpx();
}
/* 一番上の行を書く */
disp_1line(CWY0,wp);
} else {
/* 何もしない */
return;
}
}
/* 情報無しセーブ */
void
ctrl_x_ctrl_s()
{
/* line_seigyou();*/
if (CURRENT_CHANGED) {
if (buff_save_file(0,NIL,NIL,NULL)) {
/* 成功した */
CURRENT_CHANGED = 0;
disp_btm_changed_erase_x(CURRENT_TEXT);
}
} else {
under_blanc();
}
}
/* カーソル位置とマーク交換 */
void
ctrl_x_ctrl_x()
{
UNIT *wp;
int a,bp,y;
if ((a = etc_get_arg()) >= MAX_MARK) {
under_print((UBYTE *)"マーク番号が不適当です");
return;
}
if (wp = mark_get_mark(a,&bp)) { /* マークが存在した */
if ((CL == wp) && (ANALYZE[CPX].XPOS < bp)) {
/* 同じ行で、カーソルよりも右側にマークがある */
bp += 2; /* 次のセットマークで3バイトずれる予定 */
}
mark_set_mark(a);
CL = wp;
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
line_seigyou();
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
CPX = work_byte_to_CPX(bp);
CX0 = CX = ANALYZE[CPX].XPOS;
under_blanc();
work_cursor_cpx();
} else { /* マークが存在しない */
UBYTE w[MAXLINE];
sprintf((char *) w,"マーク %1d は設定されていません",a);
under_print(w);
}
}
/* (デフォルトが)前バッファ */
void
ctrl_x_b()
{
ctrl_x_b0(0); /* 尋ねる */
}
/* flag=1 で無条件実行 */
#if 0
/* まえバッファ */
void
ctrl_x_b0(int flag)
{
register int t;
t = CURRENT_TEXT;
while(1) {
t--;
if (t < 0) {
t = MAX_TEXT - 1;
}
if (TDATA[t].TEXT_FILE != -1) { /* 次のが見つかった */
if (t != CURRENT_TEXT) { /* カレントとは違うテキストである */
window_set_text(CWN,t);
window_set_current(CWN);
window_change00(CWN);
disp_btm_line(CWN);
meta_ctrl_l();
return;
}
break;
}
}
return;
}
#else
void
ctrl_x_b0(int flag)
{
register int t,f;
STR p;
t = CURRENT_TEXT;
while(1) {
t--;
if (t < 0 ) {
t = MAX_TEXT-1;
}
if (TDATA[t].TEXT_FILE != -1) { /* 前のが見つかった */
if (t != CURRENT_TEXT) { /* カレントとは違うテキストである */
UBYTE w[MAXLINE],s[MAXLINE];
sprintf((char *)w,"バッファ[%s]: ",( p = FILE_NAMES[t].CONTENT));
if (flag) {
*s = EOS;
} else {
if (under_input_cr_raw(w,s) < -1) {
under_print("[中断]");
break; /* 無効なので何もしない */
}
}
if (*s) { /* 何か指定された */
if ((f = file_search(s)) < 0) { /* 新しく作る */
ctrl_x_ctrl_f0(p);
break;
}
t = etc_text_search(f);
if (t == CURRENT_TEXT) {
/* カレントと同じだから何もしない */
break;
}
}
window_set_text(CWN,t);
window_set_current(CWN);
window_change00(CWN);
disp_btm_line(CWN);
meta_ctrl_l();
} else {
under_print("前バッファは存在しません");
}
break;
}
}
}
#endif
/* カラムを変更する */
void
ctrl_x_f()
{
UBYTE w[MAXLINE];
register int a;
if (!(a = etc_get_arg())) { /* ARG == 0 */
sprintf((char *) w,"アーギュメントにカラム数を設定して下さい");
under_print(w);
return;
}
if (!((COLUMN_MIN <= a) && (a <= COLUMN_MAX))) {
sprintf((char *) w,"カラムの設定は %d から %d までです",COLUMN_MIN,COLUMN_MAX);
under_print(w);
return;
}
if (a == CURRENT_JIZUME) { /* 字詰めが同じ */
under_print((STR)"カラムの設定が同じです");
return;
}
/* 変更する */
ctrl_x_f0(a);
change_check();
}
void
ctrl_x_f0(int a)
{
UNIT *wp;
UBYTE wlist[MAX_WINDOW]; /* フラグ用 */
int bp,y,cwn0;
register int i;
under_print((STR)"カラム変更:作業中・・・");
line_seigyou();
CURRENT_JIZUME = a;
mark_set_mark(XCODE_SYSMARK - XCODE_MARK + CWN); /* システムマーク */
window_which_has_text_number(CURRENT_TEXT,wlist);
wp = HEAD->ATO; /* 先頭行 */
line_arrange_all(wp);
wp = mark_get_mark(XCODE_SYSMARK - XCODE_MARK + CWN,&bp);
mark_erase_mark(XCODE_SYSMARK - XCODE_MARK + CWN); /* システムマークを消す */
CL = wp;
line_cl_cl();
disp_cl_center();
cwn0 = CWN; /* 保存 */
for(i = 0;i < MAX_WINDOW;i++) {
if ((i != cwn0) && (wlist[i])) {
window_change0(i);
disp_cl_center();
}
}
window_change0(cwn0); /* 戻す */
work_line_analyze();
CPX = work_byte_to_CPX(bp);
CX0 = CX = ANALYZE[CPX].XPOS;
under_blanc();
work_cursor_cpx();
}
/* 現在のバッファを削除する */
/* 削除されたウインドウは次バッファに移動する */
void
ctrl_x_k()
{
ctrl_x_k0(0);
}
/* 現在のバッファを削除する */
/* 削除されたウインドウは次バッファに移動する */
/* 移動したら1を返す */
/* flag=1 で無条件実行 */
int
ctrl_x_k0(int flag)
{
UBYTE w[MAXLINE],s[MAXLINE];
register int t,td,fd,i;
int cw;
td = CURRENT_TEXT; /* デフォルト */
if (flag) {
fd = TDATA[td].TEXT_FILE;
} else {
sprintf((char *)w,"バッファ削除[%s]: ",FILE_NAMES[CURRENT_TEXT].CONTENT);
if (under_input_cr_raw(w,s) == -2) { /* ^G である */
etc_beep();
under_print((STR)"[中断]");
return(0);
}
if (*s) { /* 何か指定された */
if ((fd = file_search(s)) < 0) { /* そんなバッファは無い */
return(0);
}
td = etc_text_search(fd);
} else {
fd = TDATA[td].TEXT_FILE;
}
}
/* td を削除する */
/* このテキストをあつかってるすべてのウインドウについて */
t = td;
while(1) {
t++;
if (t >= MAX_TEXT) {
t = 0;
}
if (TDATA[t].TEXT_FILE != -1) { /* 次である */
break;
}
}
if (t != td) { /* テキストが2つ以上存在する */
if (TDATA[td].CHANGED_FLAG) {
while(1) {
UBYTE c;
under_print0((STR)"変更点を破棄しますか [Y/N]? ");
fep_key_clear();
c = toupper(fep_inkey_raw());
if (c == 'Y') {
break;
} else if (c == 'N') {
return;
}
}
}
cw = CWN; /* 保存 */
/* td -> t とする */
for(i=0;i<MAX_WINDOW;i++) {
if (WDATA[i].WTEXTS == td) {
/*
window_set_text(i,t);
window_change(i);
ctrl_x_ctrl_f1_alway(FILE_NAMES[t].CONTENT);
*/
window_set_text(i,t);
window_set_current(i);
window_change00(i);
ctrl_x_ctrl_f1_alway(FILE_NAMES_ST[t].CONTENT);
disp_btm_line(i);
}
}
meta_ctrl_l();
ctrl_l();
CWN = cw;
window_set_text(CWN,t);
window_set_current(CWN);
window_change00(CWN);
disp_cl_center();
line_deleten(&TDATA[td].TEXT_HEADS,&TDATA[td].TEXT_TAILS);
TDATA[td].TEXT_FILE = -1;
*(FILE_NAMES[fd].CONTENT) = *(FILE_NAMES_ST[fd].CONTENT) = EOS;
main_set_view_flag();
return(1);
} else {
return(0);
}
}
/* 次バッファ */
void
ctrl_x_x()
{
ctrl_x_x0();
}
/* 次バッファ */
/* 移動したら1を返す */
int
ctrl_x_x0()
{
register int t;
t = CURRENT_TEXT;
while(1) {
t++;
if (t >= MAX_TEXT) {
t = 0;
}
if (TDATA[t].TEXT_FILE != -1) { /* 次のが見つかった */
if (t != CURRENT_TEXT) { /* カレントとは違うテキストである */
line_seigyou();
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN); /* システムマーク */
window_set_text(CWN,t);
window_set_current(CWN);
window_change00(CWN);
disp_btm_line(CWN);
meta_ctrl_l();
return(1);
}
break;
}
}
return(0);
}
/* ウインドウ縮小 */
/* 一番下のウインドウなら、上のボトムを下げる */
/* それ以外なら、ボトムを上へ */
void
ctrl_x_ctrl_z()
{
ctrl_x_w_sub(CWY1-CWY0);
}
/* レポート */
void
ctrl_x_equal()
{
UBYTE w[MAXLINE];
register int lc = 0;
register int bs = 0;
register UNIT *p;
int cc,bc,r,ll;
int page0,page00,page1;
p = HEAD->ATO;
while(p != TAIL) {
lc++;
if (p == CL) {
cc = lc;
bc = bs;
}
bs += p->LENGTH;
p = p->ATO;
}
bc += ANALYZE[CPX].BPOS;
{
register int i = 0;
register int x;
while(1) {
x = ANALYZE[i].XPOS;
if (i && (x == 0)) { /* 行が短い */
ll = i-1;
break;
}
i++;
}
}
if (PAGE == 0) {
page00 = page0 = 1; /* PAGE が 0 になっているなら、常に1頁目 */
page1 = cc;
} else {
page00 = (lc / PAGE) + 1; /* 総頁 */
page0 = ((cc-1) / PAGE) + 1; /* 現頁 */
page1 = ((cc-1) % PAGE) + 1; /* 現行 */
}
sprintf((char *)w,"%d/%d 行 %d/%d頁の%d行目 %d/%d 桁 文字数 %d/%d (%d%c) 文字= 0x%X",
cc,lc,page0,page00,page1,ANALYZE[CPX].XPOS,ANALYZE[ll].XPOS,
bc,bs,(bs)? bc*100/bs:0,'%',line_cpx_code());
under_print(w);
}
/* ウインドウ拡大 */
/* 一番下のウインドウなら、上のウインドウのボトムを上げる */
/* それ以外なら、ボトムを下へ */
void
ctrl_x_up_arrow()
{
ctrl_x_w_sub(CWY1-CWY0+2);
}
/* 現在のウインドウを消す */
/* 上のウインドウを拡張する */
/* 上にウインドウがなければ下を拡張する */
void
ctrl_x_0()
{
register int i,y;
UNIT *wp;
int cwn0,sbottom,stop;
line_seigyou();
if (!(sbottom = WDATA[CWN].WY0)) { /* 一番上のウインドウであった */
if ((stop = WDATA[CWN].WY1 + 2) == UNDER_Y) { /* 一番下のウインドウであった */
under_print((STR)"このウインドウは削除出来ません");
return;
} else { /* 下にウインドウがある */
cwn0 = CWN;
for(i=0;i<MAX_WINDOW;i++) {
if (WDATA[i].WY0 == stop) { /* このウインドウに行く */
window_change(i);
y = CWY0+CY;
wp = line_my_screen(0); /* カレントの一番上の行 */
window_change_size(CWN,WDATA[cwn0].WX0,WDATA[cwn0].WY0,-1,-1);
disp_btm_line(CWN);
disp_cl_y(y);
/* 前のウインドウを閉める */
window_set_size(cwn0,-1,-1,-1,-1);
window_set_position(cwn0,0,0,0);/* カーソル位置の設定 */
window_set_text(cwn0,-1);
break;
}
}
}
} else { /* 上にウインドウがある */
cwn0 = CWN;
for(i=0;i<MAX_WINDOW;i++) {
if ((stop = WDATA[i].WY1 + 2) == sbottom) {
/* 現在のウインドウ削除し、このウインドウにする */
window_change(i);
y = CWY0+CY;
wp = line_my_screen(0); /* カレントの一番上の行 */
window_change_size(CWN,-1,-1,WDATA[cwn0].WX1,WDATA[cwn0].WY1);
disp_btm_line(CWN);
disp_cl_y(y);
/* 前のウインドウを閉める */
window_set_size(cwn0,-1,-1,-1,-1);
window_set_position(cwn0,0,0,0);/* カーソル位置の設定 */
window_set_text(cwn0,-1);
break;
}
}
}
ctrl_l();
}
/* 現在以外のウインドウを消す */
void
ctrl_x_1()
{
UNIT *wp;
register int y,i;
line_seigyou();
y = CWY0+CY;
wp = line_my_screen(0); /* カレントの一番上の行 */
window_change_size(CWN,0,0,XWIDTH-1,YWIDTH-3); /* カレントをフルサイズに */
disp_cl_y(y);
for(i=0;i<MAX_WINDOW;i++) {
if (i != CWN) {
window_set_size(i,-1,-1,-1,-1);
window_set_position(i,0,0,0); /* カーソル位置の設定 */
window_set_text(i,-1);
}
}
disp_btm_line(CWN);
}
/* 現在のウインドウを2分割 */
/* 2分割より上ならカーソルは上のウインドウに */
/* 2分割より下ならカーソルは下のウインドウに */
/* ちょうどボトムラインだったなら、上へ1行貼り付きスクロール(^X^N)する */
void
ctrl_x_2()
{
if (ctrl_x_20() >= 0) {
ctrl_l();
}
}
/* 新しく作ったウインドウの番号を返す */
/* さもなくば-1 */
int
ctrl_x_20()
{
int y,y0,fw,c;
UNIT *top;
UNIT *wp;
if ((y = CWY1-CWY0) < 2) { /* 分割できない */
UBYTE w[MAXLINE];
sprintf((char *) w,"%1d 行のウインドウは分割出来ません",y+1);
under_print(w);
return(-1);
}
if ((y /= 2) == CY) {
ctrl_x_ctrl_n(); /* 分割点がカーソルの上なら上に張り付きスクロール */
} /* CY changed */
if ((fw = window_get_free_window_number()) < 0) { /* 無い */
UBYTE w[MAXLINE];
sprintf((char *) w,"ウインドウの数は %d までです",MAX_WINDOW);
under_print(w);
return(-1);
}
line_seigyou();
if (CY < y) { /* カーソルは上に行く */
top = line_my_top();
c = CWN;
} else { /* カーソルは下に行く */
top = line_my_screen(y+1);
CY -= y+1;
c = fw;
}
window_dup_window(CWN,fw); /* サイズを複写する */
/* カーソルが下に行く場合に、一瞬上に'==='が出てしまう・・・ */
y0 = CWY0;
window_change_size(CWN,-1,-1,-1,y0+y-1); /* 上の大きさ */
window_change_size(fw,-1,y0+y+1,-1,-1); /* 下の大きさ */
disp_window_top_flush(CWN,top);
disp_window_top_flush(fw,top);
/* カーソルの絶対位置は変わらない */
if (c != CWN) {
int c0;
c0 = CWN;
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+c); /* システムマーク */
window_change(c);
return(c0);
} else {
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+fw); /* システムマーク */
return(fw);
}
}
/* ファイル名を変える */
void
ctrl_x_n()
{
UBYTE fname[MAXLINE],w[MAXLINE];
register int i;
sprintf((char *) w,"ファイル名変更 [%s]: ",etc_ret_current_path());
if (under_input_cr_raw(w,fname) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
return;
}
strcpy(FILE_NAMES[CURRENT_TEXT].CONTENT,fname);
etc_name_to_full(FILE_NAMES[CURRENT_TEXT].CONTENT);
strcpy(FILE_NAMES_ST[CURRENT_TEXT].CONTENT,fname);
FILE_POINTERS[CURRENT_TEXT] = NULL_FP;
/* このテキストをあつかってるすべてのウインドウについても! */
for(i=0;i<MAX_WINDOW;i++) {
if (WDATA[i].WTEXTS == CURRENT_TEXT) {
disp_btm_line(i);
}
}
main_set_view_flag();
if (!view_flag) {
change_check();
}
}
/* 次(下)ウインドウ */
void
ctrl_x_o()
{
register int i,stop;
line_seigyou();
if ((stop = WDATA[CWN].WY1 + 2) == UNDER_Y) { /* 一番下のウインドウであった */
stop = 0;
}
for(i=0;i<MAX_WINDOW;i++) {
if ((WDATA[i].WY0 == stop) && (i != CWN)) { /* このウインドウに行く */
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN); /* システムマーク */
window_set_current(i);/* ,,, */
window_change00(i);
window_change(i);
/* disp_btm_line(i);*/
/*
window0();
printf("[%d]",CY);binkey();
CL = line_my_screen(CY);
line_cl_cl();
*/
ctrl_l();
break;
}
}
etc_while_fep_qxf();
}
/* 前ウインドウ */
void
ctrl_x_p()/* ,,, */
{
register int i,sbottom;
line_seigyou();
if (!(sbottom = WDATA[CWN].WY0)) { /* 一番上のウインドウであった */
sbottom = UNDER_Y;
}
for(i=0;i<MAX_WINDOW;i++) {
if (((WDATA[i].WY1 + 2) == sbottom) && (i != CWN)) { /* このウインドウに行く */
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN); /* システムマーク */
window_set_current(i);/* ,,, */
window_change00(i);
window_change(i);
ctrl_l();
break;
}
}
/*error("見つかってない");*/
}
/* ウインドウの行数設定 */
void
ctrl_x_w()
{
int a;
if (!(a = etc_get_arg())) { /* アーギュメントがない */
under_print((STR)"ウインドウの行数設定ができません");
return;
}
ctrl_x_w_sub(a);
}
/* カレントウインドウの行数を a にする */
void
ctrl_x_w_sub(int a)
{
register int i,wy;
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN); /* システムマーク */
if ((wy = CWY1 + 2) == UNDER_Y) { /* 一番下のウインドウであった */
wy = CWY0 - 2;
for(i=0;i<MAX_WINDOW;i++) { /* 上のウインドウを捜す */
if (WDATA[i].WY1 == wy) {
break;
}
}
if (!window_2_change_size(i,CWN,(CWY1-CWY0+1)-a)) { /* 変更しなかった */
under_print((STR)"ウインドウの行数変更ができません");
} else {
ctrl_l();
under_blanc();
}
} else {
for(i=0;i<MAX_WINDOW;i++) { /* 下のウインドウを捜す */
if (WDATA[i].WY0 == wy) {
break;
}
}
if (!window_2_change_size(CWN,i,a-(CWY1-CWY0+1))) { /* 変更しなかった */
under_print((STR)"ウインドウの行数変更ができません");
} else {
ctrl_l();
under_blanc();
}
}
mark_erase_mark(XCODE_SYSMARK-XCODE_MARK+CWN); /* システムマーク */
}
/* チャイルド(COMMAND.X) */
void
ctrl_x_gyo()
{
int rc;
UBYTE w[MAXLINE],cn[MAXLINE];
UBYTE fep_func_save_tmp[712]; /* ファンクションキーの保存 */
UINT mode;
mode = K_SFTSNS();
if (CMDMOD) {
if ((rc = under_input_cr_raw((STR) "Human68k:",cn)) < 0) { /* 無効であった = ^G */
if (rc == -1) {
ctrl_x_c();
} else {
under_print((STR)"[中断]");
}
fep_ledset(mode);
return;
}
} else {
if (under_input_cr_raw((STR) "! ",cn) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
fep_ledset(mode);
return;
}
}
strcpy(w,"COMMAND.X /C ");
strcat(w,cn);
FNCKEYGT(0,fep_func_save_tmp);
init_exit();
/* fep_mode_set0((STR)"H--M");*/
/* KNJCTRL(11,DIC_MODE);*/
B_CLR_AL();
if ((rc = etc_child(w)) < 0) {
B_PRINT("実行出来ませんでした\n\n\r");
}
B_PRINT("[終了]");
INPOUT(0xff); /* おまじない */
fep_inkey_raw();
if (DUM_FLAG) { /* ダミーモードである */
KNJCTRL(7,1);
} else {
KNJCTRL(7,0);
}
FNCKEYST(0,fep_func_save_tmp);
etc_func_on0();
ctrl_l();
fep_ledset(mode);
}
/* チャイルド(直接) */
void
ctrl_x_doller()
{
int rc;
UBYTE w[MAXLINE],cn[MAXLINE];
UBYTE fep_func_save_tmp[712]; /* ファンクションキーの保存 */
UINT mode;
mode = K_SFTSNS();
if (under_input_cr_raw((STR) "$ ",cn) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
fep_ledset(mode);
return;
}
FNCKEYGT(0,fep_func_save_tmp);
init_exit();
if ((rc = etc_child(cn)) < 0) {
B_PRINT("実行出来ませんでした\n\n\r");
}
B_PRINT("[終了]");
INPOUT(0xff); /* おまじない */
fep_inkey_raw();
if (DUM_FLAG) {
KNJCTRL(7,1);
} else {
KNJCTRL(7,0);
}
FNCKEYST(0,fep_func_save_tmp);
etc_func_on0();
ctrl_l();
fep_ledset(mode);
}
/* マーク解除 */
void
ctrl_x_space()
{
int a;
UBYTE w[MAXLINE];
if ((a = etc_get_arg()) <= MAX_MARK) {
mark_erase_mark(a);
}
sprintf((char *) w,"[マーク %1d 解除]",a);
under_print(w);
}
/* バッファの一覧 */
void
ctrl_x_ctrl_b()
{
int f,t,wn,cwn0;
UBYTE filename[MAXLINE];
UBYTE w[MAXLINE];
UBYTE wlist[MAX_WINDOW]; /* フラグ用 */
UNIT *p;
line_seigyou();
cwn0 = CWN;
if ((f = file_search((STR)"[List]")) >= 0) { /* 既にある */
UBYTE list[MAX_WINDOW];
int i;
t = etc_text_search(f);
if (window_which_has_text_number(t,list)) {
/* ウインドウが存在する */
for(i=0;i<MAX_WINDOW;i++) {
if (list[i]) { /* 最初のウインドウで抜ける */
window_change(i);
break;
}
}
} else { /* ウインドウが存在しない */
if ((wn = ctrl_x_20()) < 0) { /* 新しく作られたウインドウ */
/* できなかった */
return;
}
window_change(wn);
ctrl_x_ctrl_f1_alway((STR)"[List]");
}
} else { /* 新しくバッファを作る */
if (window_get_free_text_number() < 0) { /* 開いたテキストがない */
etc_inp_y((STR)"扱うテキストの数が多すぎます。中断します [Y]?");
return;
}
if ((wn = ctrl_x_20()) < 0) { /* 新しく作られたウインドウ */
/* できなかった */
return;
}
window_change(wn); /* カレントを移動する */
}
/* cwn0 = CWN; *//* 保存 */
/* wn にバッファリストを表示する */
if (strcmp(FILE_NAMES_ST[WDATA[CWN].WTEXTS].CONTENT,"[List]")) {
ctrl_x_ctrl_f0((STR)"[List]");
} else if (HEAD->ATO != TAIL) {
line_deleten_echo(HEAD,TAIL);
buff_read_file_new();
}
ctrl_x_f0(COLUMN_MAX);
CL= HEAD->ATO;
line_store_and_echo(CL,(STR)"状態 行数 サイズ バッファ名 ファイル名\n");
line_cl_cl();
CX = CX0 = CPX = 0;
p = line_get_free_and_store_ck(
(STR)"---- -------- ------ ---------- ----------\n");
line_append1_echo(p);
for(t=0;t<MAX_TEXT;t++) {
UBYTE w[MAXLINE],w0[MAXLINE];
register int l,lc;
register UNIT *p,*pt;
int j;
if ((TDATA[t].TEXT_FILE >= 0) && (t != CURRENT_TEXT)) {
p = (TDATA[t].TEXT_HEADS).ATO;
pt = &TDATA[t].TEXT_TAILS;
l = lc = 0;
while(p != pt) {
lc++;
l += p->LENGTH;
p = p->ATO;
}
etc_get_pathname(w0,FILE_NAMES[t].CONTENT);
sprintf((char *)w,"@%c%c. %6d行 %6d %-32s%-s",
(TDATA[t].CHANGED_FLAG) ?'*':'.',
(TDATA[t].BAK_FLAG) ?'B':'.',
lc,l,FILE_NAMES_ST[t].CONTENT,w0);
strcat((char *)w,"\n");
p = line_get_free_and_store_ck(w);
line_append1_echo(p);
}
}
window_change(cwn0);
ctrl_l();
}
/* シェルを起動 */
void
ctrl_x_c()
{
UBYTE fep_func_save_tmp[712]; /* ファンクションキーの保存 */
UINT mode;
mode = K_SFTSNS();
fep_get_led0();
FNCKEYGT(0,fep_func_save_tmp);
init_exit();
/* fep_mode_set0((STR)"H--M");*/
B_CLR_AL();
etc_child("COMMAND.X");
#if 1
INPOUT(0xff); /* おまじない */
if (DUM_FLAG) {
KNJCTRL(7,1);
} else {
KNJCTRL(7,0);
}
FNCKEYST(0,fep_func_save_tmp);
etc_func_on0();
ctrl_l();
#endif
fep_follow_led0();
fep_ledset(mode);
}
/* ファイル書き出し */
void
ctrl_x_ctrl_w()
{
UBYTE filename[MAXLINE];
UBYTE w[VERY_LONG_LINE*4];
UNIT *wp;
FILE *fp;
line_seigyou();
sprintf((char *) w,"ファイル書き出し [%s]: ",etc_ret_current_path());
if (under_input_cr_raw(w,filename) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
return;
}
buff_save_file(0,HEAD->ATO,NIL,filename);
}
/* CL の前後にある改行だけの行を削除する */
void
ctrl_x_ctrl_o()
{
register UNIT *wp;
UNIT *wp_mae,*wp_ato;
line_seigyou();
if (!etc_just_kaigyou(CL)) {
return;
}
/* CL は改行だけのコードである */
wp = wp_mae = wp_ato = CL;
while(1) {
if ((wp = wp->MAE) == HEAD) {
break;
}
if (etc_just_kaigyou(wp)) {
wp_mae = wp;
} else {
break;
}
}
wp = CL;
while(1) {
if ((wp = wp->ATO) == TAIL) {
break;
}
if (etc_just_kaigyou(wp)) {
wp_ato = wp;
} else {
break;
}
}
if (commander_is_last_cut_buff_type()) {
} else { /* でなければ、カットバッファをクリア */
buff_clear_cut_buff();
}
change_check();
if (wp_ato->ATO != TAIL) {
wp_ato = wp_ato->ATO;
}
CL = wp_ato;
line_cl_cl();
work_line_analyze();
CPX = CX0 = CX = 0;
work_delete_to_cut_buff(wp_mae,0,CL,0);
work_cursor_cpx();
}
void
ctrl_x_left_braket()
{
if (MACRO_DEF_FLAG) {
under_print("[マクロ記録中です]");
MACRO_COUNT -= 2;
} else {
MACRO_DEF_FLAG = 1;
MACRO_COUNT = 0;
under_print("[マクロ記録開始]");
}
}
void
ctrl_x_right_braket()
{
if (MACRO_DEF_FLAG) {
under_print("[マクロ記録終了]");
if (MACRO_COUNT) {
MACRO_SEQUENCE[MACRO_COUNT-2] = 0; /* 自分を消す */
} else {
MACRO_SEQUENCE[0] = 0;
}
MACRO_COUNT = MACRO_DEF_FLAG = 0;
} else {
under_print("[マクロ記録中ではありません]");
}
}
/* マクロ実行 */
void
ctrl_x_e()
{
register int a;
if (MACRO_DEF_FLAG) {
MACRO_COUNT -= 2;
} else {
if (a = etc_get_arg()) { /* 回数が指定された */
MACRO_EXE_FLAG = a;
} else {
MACRO_EXE_FLAG = 1;
}
MACRO_COUNT = 0;
}
}
/* 逆方向無条件置換 */
void
ctrl_x_r()
{
meta_replace_r(1);
}
/* 逆方向確認置換 */
void
ctrl_x_ctrl_r()
{
meta_replace_r(0);
}